#include <stdio.h>
#include <string.h>

int max(int a,int b) {
    return a>b ? a : b;
}

int main() {
	int m,n; 	//m为容量，n为种类数量
	scanf("%d %d",&m,&n);
	int weight[n],value[n],num[n];
	for(int i=0;i<n;i++) scanf("%d",&weight[i]);
	for(int i=0;i<n;i++) scanf("%d",&value[i]);
	for(int i=0;i<n;i++) scanf("%d",&num[i]);
	int dp[m+1];
	memset(dp,0,sizeof(dp));
    for(int i=0;i<n;i++) {   //遍历物品
        for(int j=m;j>=weight[i];j--) {   //遍历背包容量
            //以上为01背包问题
			for(int k=1;k<=num[i] && (j-k*weight[i]>=0);k++) {   //遍历物品数目
				dp[j]=max(dp[j],dp[j-k*weight[i]]+k*value[i]);
			}
        }
    }
	printf("%d\n",dp[m]);
	return 0;
}

/*
#include <stdio.h>
#include <string.h>

int max(int a,int b) {
    return a>b ? a : b;
}

int main() {
	int m,n; 	//m为容量，n为种类数量
	scanf("%d %d",&m,&n);
	int weight[n],value[n],num[n];
	int sum=0;
	for(int i=0;i<n;i++) scanf("%d",&weight[i]);
	for(int i=0;i<n;i++) scanf("%d",&value[i]);
	for(int i=0;i<n;i++) {
	    scanf("%d",&num[i]);
	    sum+=num[i];
	}
	int dp[m+1],w[sum],v[sum];
	//新的大小和价值数组
	int index=0;
	for(int i=0;i<n;i++) {
        while(num[i]--) {
            w[index] = weight[i];
            v[index] = value[i];
            index++;
        }
    }
	memset(dp,0,sizeof(dp));
    for(int i=0;i<sum;i++) {   //遍历物品,数目发生改变：n-->sum
        for(int j=m;j>=w[i];j--) {   //遍历背包容量
            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
        }
    }
	printf("%d\n",dp[m]);
	return 0;
}
*/